package it.pir.es05ChatTCP_TLS;

import java.io.*;
import java.net.Socket;
import java.util.Map;

public class ServerObj extends Server {

	public ServerObj(int port) throws IOException {
		super(port);
	}

	@Override
	public void broadcastSend(String nickname, Message message) throws IOException {
        chat.addMessage(message.getNickname() + ": "+ message.getMessage());
		//System.out.println(message.getNickname() + ": "+ message.getMessage());
		for(Map.Entry<String, OutputStream> entry : clients.entrySet()) {
			if(!nickname.equals(entry.getKey())) {
				ObjectOutputStream oos = (ObjectOutputStream)entry.getValue();
				oos.writeObject(message);
				oos.flush();
			}
		}
	}
	
	@Override
	public void start() {
		ObjectInputStream objectInputStream;
		while(true) {
			try {
				Socket socket = serverSocket.accept(); // Attendi la connessione di un nuovo client
				objectInputStream = new ObjectInputStream(socket.getInputStream()); // Apri un input stream (dedicato al client)
				Message message = (Message)objectInputStream.readObject(); // Leggi il messaggio
				if(message.getType()==Message.AUTHENTICATION) {
					ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); // Apri un output stream (dedicato al client)
					if(clients.containsKey(message.getNickname())) {
						oos.writeObject(new Message("SERVER","ERRORE! Nickname già in uso!", Message.AUTHENTICATION));
						oos.flush();
						socket.close();
					} else {
						addClient(message.getNickname(), oos); // Aggiungi il client alla lista dei client
						Message m = new Message("SERVER", "Autenticazione effettuata! Ora sei connesso come " + message.getNickname(), Message.AUTHENTICATION); // Risposta per il client
						oos.writeObject(m);
						oos.flush();
						
						/* Viene eseguito il thread del gestore dei client che invia messaggi a tutti i client*/
						broadcastSend(message.getNickname(), new Message("SERVER", "L'utente " + message.getNickname() + " è entrato nella chat.", Message.MESSAGE)); // Invia una notifica a tutti gli altri per notificare che l'utente è entrato in chat

						// Avvia la gestione dei messaggi del nuovo client
						ClientHandler ch = new ClientHandlerObj(message.getNickname(), this, objectInputStream);
						Thread t = new Thread(ch);
						t.start();
					}
				} else {
					// ERRORE: Il primo messaggio deve essere di autenticazione!
					System.out.println("ERRORE!!! L'utente " + message.getNickname() + " ha inviato un messaggio non valido!");
				}
			} catch (IOException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
	}

}
